﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using DBTransMan = Autodesk.AutoCAD.DatabaseServices.TransactionManager;
using DNA;

namespace TJADRICD.CollaborativeDesignPlugin
{
    public static class UtilitiesForReference
    {
        public static ObjectId CreateLine()
        {
            Point3d startPt = new Point3d(4.0, 2.0, 0.0);
            Point3d endPt = new Point3d(10.0, 7.0, 0.0);
            Line line = new Line(startPt, endPt);

            ObjectId lineId;
            Database db = Application.DocumentManager.MdiActiveDocument.Database;
            DBTransMan tm = db.TransactionManager;

            using (Transaction ta = tm.StartTransaction())
            {
                BlockTable bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
                BlockTableRecord btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
                lineId = btr.AppendEntity(line);
                tm.AddNewlyCreatedDBObject(line, true);
                ta.Commit();
            }
            return lineId;
        }

        public static ObjectId CreateCircle()
        {
            Point3d center = new Point3d(9.0, 3.0, 0.0);        //定义圆的圆心
            Vector3d normal = new Vector3d(0.0, 0.0, 1.0);　　　//定义圆的法向量，一般设置成Z轴方向
            Circle circle = new Circle(center, normal, 2.0);　　//创建一个半径为2的圆
            ObjectId circId;　　　　　　　　　　　　　　　　//声明用作返回值的变量
            Database db = Application.DocumentManager.MdiActiveDocument.Database;　//获取当前文档所在的数据库
            DBTransMan tm = db.TransactionManager;　　　　　　//获取事务处理管理器，用来对数据库进行操作
            using (Transaction ta = tm.StartTransaction())　　//启动事务处理
            {
                BlockTable bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);　//获取块表
                BlockTableRecord btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);　//获取模型空间所在的块表记录
                circId = btr.AppendEntity(circle);      //向模型空间加入圆
                tm.AddNewlyCreatedDBObject(circle, true);　//通知事务处理
                ta.Commit();　　　　　　　　　　　　　//提交事务处理
            }
            return circId;　　　　　　　　　//返回圆的ObjectId
        }

        public static void ChangeColor(ObjectId entId, int newColor)
        {
            Database db = Application.DocumentManager.MdiActiveDocument.Database;   //获取当前文档所在的数据库
            DBTransMan tm = db.TransactionManager;       //获取事务处理管理器，用来对数据库进行操作
            using (Transaction ta = tm.StartTransaction())       //启动事务处理
            {
                Entity ent = (Entity)tm.GetObject(entId, OpenMode.ForWrite, false);  //获取ObjectId为entId的实体对象
                ent.ColorIndex = newColor;　　　　　　　//设置实体的颜色索引值为newColor
                ta.Commit();                          //提交事务处理
            }
        }

        public static void CreateGroup(ObjectIdCollection objIds, string groupName)
        {
            Group gp = new Group(groupName, true);         //创建名为groupName的组
            Database db = Application.DocumentManager.MdiActiveDocument.Database;　　//获取当前文档所在的数据库
            DBTransMan tm = db.TransactionManager;　　　　//获取事务处理管理器，用来对数据库进行操作
            using (Transaction ta = tm.StartTransaction())　　　//启动事务处理
            {
                DBDictionary dict = (DBDictionary)tm.GetObject(db.GroupDictionaryId, OpenMode.ForWrite, false);　　//获取组所在的"Group"字典
                dict.SetAt(groupName, gp);　　//在"Group"字典中加入组对象
                foreach (ObjectId thisId in objIds)　　//遍历传入的实体集合的ObjectId
                {
                    gp.Append(thisId);　　　//在组中加入ObjectId为thisId的实体
                }
                tm.AddNewlyCreatedDBObject(gp, true);　　//通知事务处理管理器
                ta.Commit();　　　　　　　　//提交事务处理
            }
        }

        #region 图层相关

        public static void CreateNewLayer()
        {
            LayerTableRecord ltRec = new LayerTableRecord();　　//定义一个层表记录对象
            ltRec.Name = "ASDK_MYLAYER";　　　　　　　　　　　　//设置层表记录的名字为"ASDK_MYLAYER"
            Database db = Application.DocumentManager.MdiActiveDocument.Database;  //获取当前文档所在的数据库
            DBTransMan tm = db.TransactionManager;　　　　　　　//获取事务处理管理器，用来对数据库进行操作　　
            using (Transaction ta = tm.StartTransaction())　　　//启动事务处理
            {
                LayerTable lt = (LayerTable)tm.GetObject(db.LayerTableId, OpenMode.ForWrite, false);　//获取层表对象
                lt.Add(ltRec);　　　　　　　　　　　　　　　//在层表中加入创建的层表记录
                tm.AddNewlyCreatedDBObject(ltRec, true);　　　//通知事务处理管理器
                ta.Commit();　　　　　　　　　　　　　　　　//提交事务处理
            }
        }

        public static void CloseLayer()
        {
            Database db = Tools.Database;
            DBTransMan tm = db.TransactionManager;
            using (Transaction trans = tm.StartTransaction())
            {
                var layers = from layer in db.GetAllLayers(trans, OpenMode.ForWrite)
                             where (layer is LayerTableRecord)
                             select layer;
                foreach (var thelayer in layers)
                {
                    thelayer.IsOff = true;
                }
                trans.Commit();
            }
        }

        public static void CloseLayerByName(string name)
        {
            Database db = Tools.Database;
            DBTransMan tm = db.TransactionManager;
            using (Transaction trans = tm.StartTransaction())
            {
                var layers = from layer in db.GetAllLayers(trans, OpenMode.ForWrite)
                             where (layer.Name == name)
                             select layer;
                foreach (var thelayer in layers)
                {
                    thelayer.IsOff = true;
                }
                trans.Commit();
            }
        }

        #endregion
    }
}
